#include<cstdio>
#include<cstring>
#include<algorithm>
#define lc o<<1
#define rc o<<1|1
using namespace std;
typedef long long LL;
typedef double db;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); }
	return x*f;
}
const int MAXN=1050;
int n,m,w[MAXN][12],v[MAXN][12],f[MAXN][MAXN];
void dfs(int o,int stat,int dep)
{
	memset(f[o],0,sizeof(f[o]));
	if(dep==n)
	{
		for(int j=1;j<n;++j)
		{
			if(stat&1)f[o][1]+=w[o][j];
			else f[o][0]+=v[o][j];
			stat>>=1;
		}
		return;
	}
	dfs(lc,stat<<1,dep+1);
	dfs(rc,stat<<1,dep+1);
	for(int i=0;i<=1<<(n-dep-1);++i)
		for(int j=0;j<=1<<(n-dep-1);++j)
			f[o][i+j]=max(f[o][i+j],f[lc][i]+f[rc][j]);
	dfs(lc,stat<<1|1,dep+1);
	dfs(rc,stat<<1|1,dep+1);
	for(int i=0;i<=1<<(n-dep-1);++i)
		for(int j=0;j<=1<<(n-dep-1);++j)
			f[o][i+j]=max(f[o][i+j],f[lc][i]+f[rc][j]);
	return;
}
int main()
{
	n=read();m=read();
	for(int i=1<<(n-1);i<=(1<<n)-1;++i)
		for(int j=1;j<n;++j)
			w[i][j]=read();;
	for(int i=1<<(n-1);i<=(1<<n)-1;++i)
		for(int j=1;j<n;++j)
			v[i][j]=read();;
	dfs(1,0,1);
	int ans=0;
	for(int i=0;i<=m;++i)
		ans=max(ans,f[1][i]);
	printf("%d\n",ans);
	return 0;
}
